package com.gadgets.test.util;

import com.gadgets.test.dto.CsvDataObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能说明：
 *
 * @author Unclexiu
 * @version V202101.00.000
 * @data 2022-09-21
 * 修改记录：  修改日期          修改人员    修改说明
 * 2022-09-21  hspcadmin   创建文件
 */
public class CsvSqlReader {

	/**
	 * 基于Csv文件数据生成插入SQL序列
	 * @param dto	数据对象
	 * @return		SQL序列
	 */
	public static List<String> sqlInsertGenerator(CsvDataObject dto){
		// 生成数据准备SQL
		List<String> insertSql = new ArrayList<>();
		// 生成SQL头
		String insertSqlHeader = "INSERT INTO "+dto.getTableName()+"("+dto.getColumnNames()+") VALUES (";
		StringBuilder builder = new StringBuilder();
		if(null!=dto.getValuesList()){
			for (String[] columnValues : dto.getValuesList()) {
				// 清空Buffer，并初始化
				builder.setLength(0);
				builder.append(insertSqlHeader);
				if(null!=columnValues && columnValues.length!=0){
					for (String columnValue : columnValues) {
						String[] columnValueArr = columnValue.split("\\|");
						for (String value : columnValueArr) {
							builder.append("'").append(value).append("',");
						}
					}
					// 删除最后多余的一个英文逗号
					builder.setLength(builder.length()-1);
					builder.append(");");
				}
				// 将SQL加入容器中
				insertSql.add(builder.toString());
			}
		}
		return insertSql;
	}

	/**
	 * 基于Csv文件数据生成插入SQL序列
	 * @param dto	数据对象
	 * @return		SQL序列
	 */
	public static List<String> sqlTruncateGenerator(CsvDataObject dto){
		List<String> truncateSql = new ArrayList<>();
		// 直接清理数据
		truncateSql.add("TRUNCATE TABLE "+dto.getTableName());
		return truncateSql;
	}

	/**
	 * 读取Csv文件生成Csv数据对象
	 * @param csvClasspath	Csv 的 classpath 文件路径
	 * @return	Csv数据对象
	 */
	public static CsvDataObject readCsv(String csvClasspath) throws Exception {
		CsvDataObject dto = new CsvDataObject();
		// 路径格式化
		csvClasspath = csvClasspath.replaceAll("\\\\","/");
		// 获取文件读取流
		InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(csvClasspath);
		if(null!=inputStream) {
			InputStreamReader streamReader = new InputStreamReader(inputStream);
			BufferedReader reader = new BufferedReader(streamReader);
			String[] pathArrs = csvClasspath.split("/");
			// 将文件名去除后缀后的前半部分为表名
			dto.setTableName(pathArrs[pathArrs.length-1].split("\\.")[0]);
			String line = null;
			int i = 1;
			while (null!=(line=reader.readLine())){
				if(i==1){
					// 第一行是表头列名
					dto.setColumnNames(line);
					i++;
				}else{
					// 第二行开始时数据，字段之间用|+|分割
					dto.getValuesList().add(line.split("\\|\\+\\|"));
				}
			}
		}else{
			throw new Exception(csvClasspath+"文件不存在");
		}
		return dto;
	}

}
